package sys_ctl

import (
	"net/http"
	"ubt-rbac-service/internal/app/model"
	"ubt-rbac-service/internal/app/model/sys_mod"
	"ubt-rbac-service/internal/app/service/sys_serv"
	"ubt-rbac-service/internal/app/util"
	"ubt-rbac-service/internal/core/parse"
)

type sysModule struct{}

var SysModCtl sysModule

// Save 保存模块
func (c *sysModule) Save(w http.ResponseWriter, r *http.Request) {
	// 将请求的参数转换为请求结构体
	vo, errStr := parse.Parse(r, &sys_mod.SysModSaveReq{})
	if vo == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: errStr})
		return
	}
	req := vo.(*sys_mod.SysModSaveReq)
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	userId := userInfo.UserId
	// 过滤关键参数值中的非法字符
	req.ModId = util.InputFilter(req.ModId, true)
	req.ModName = util.InputFilter(req.ModName, true)
	req.ModCode = util.InputFilter(req.ModCode, true)
	req.Url = util.InputFilter(req.Url, true)
	req.ParentId = util.InputFilter(req.ParentId, true)
	if req.ModId == req.ParentId {
		util.ToJson(w, &model.ResJson{Code: 403, Msg: "对不起，不可选择当前模块为父级模块，请重试！"})
		return
	}
	// 判断编码是否重复
	extVo := &sys_mod.SysModExtVo{ModId: req.ModId, ModCode: req.ModCode}
	if ext := sys_serv.SysModServ.Exists(extVo); ext {
		util.ToJson(w, &model.ResJson{Code: 402, Msg: "对不起，填写的编码已存在，请更换！"})
		return
	}
	var (
		result *model.Result
		kind   uint8
	)
	if req.ModId == "" {
		// 新增
		result = sys_serv.SysModServ.Add(req)
		kind = 1
	} else {
		// 修改
		result = sys_serv.SysModServ.Update(req)
		kind = 3
	}
	if result != nil && result.RetCode == 1001 {
		logReq := &sys_mod.SysLogSaveReq{UserId: userId, ModCode: "10010101", Kind: kind, OptOrg: userInfo.DeptId}
		sys_serv.SysLogServ.Add(logReq)
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok"})
	} else {
		util.ToJson(w, &model.ResJson{Code: 500, Msg: result.RetMsg})
	}
}

// Deletes 删除模块
func (c *sysModule) Deletes(w http.ResponseWriter, r *http.Request) {
	// 将请求的参数转换为请求结构体
	vo, errStr := parse.Parse(r, &sys_mod.SysModDelsReq{})
	if vo == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: errStr})
		return
	}
	req := vo.(*sys_mod.SysModDelsReq)
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	// 过滤关键参数值中的非法字符
	req.ModIds = util.InputFilter(req.ModIds, true)
	result := sys_serv.SysModServ.Deletes(req)
	if result != nil && result.RetCode == 1001 {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, ModCode: "10010101", Kind: 2, OptOrg: userInfo.DeptId}
		sys_serv.SysLogServ.Add(logReq)
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok"})
	} else {
		util.ToJson(w, &model.ResJson{Code: 500, Msg: result.RetMsg})
	}
}

// One 获取模块详情
func (c *sysModule) One(w http.ResponseWriter, r *http.Request) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	u := r.URL.Query()
	if u == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: "对不起，请求的参数不能为空，请重试"})
		return
	}
	// 过滤关键参数值中的非法字符
	modId := u.Get("modId")
	modId = util.InputFilter(modId, true)
	if modId == "" || len(modId) != 21 {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: "对不起，请求的编号参数为空或不正确，请重试！"})
		return
	}
	result := sys_serv.SysModServ.One(modId)
	if result != nil && result.RetCode == 1001 {
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok", Data: result.RetData})
	} else {
		util.ToJson(w, &model.ResJson{Code: 404, Msg: result.RetMsg})
	}
}

// List 获取模块树状列表
func (c *sysModule) List(w http.ResponseWriter, r *http.Request) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	if result := sys_serv.SysModServ.List(); result != nil && result.RetCode == 1001 {
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok", Data: result.RetData})
	} else {
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "暂无内容"})
	}
}

// Tree 获取模块树状列表
func (c *sysModule) Tree(w http.ResponseWriter, r *http.Request) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	if result := sys_serv.SysModServ.Tree(); result != nil && result.RetCode == 1001 {
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok", Data: result.RetData})
	} else {
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "暂无内容"})
	}
}

// Sort 获取模块数量，用于排序
func (c *sysModule) Sort(w http.ResponseWriter, r *http.Request) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	u := r.URL.Query()
	if u == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: "对不起，请求的参数不能为空，请重试"})
		return
	}
	parentId := u.Get("parentId")
	parentId = util.InputFilter(parentId, true)
	if parentId == "" || len(parentId) != 21 {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: "对不起，请求的父级编号为空或不正确，请重试！"})
		return
	}
	result := sys_serv.SysModServ.Sort(parentId)
	util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok", Data: result.RetData})
}

// Menu 获取模块菜单树状菜单
func (c *sysModule) Menu(w http.ResponseWriter, r *http.Request) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	modCodes := userInfo.ModCodes
	if result := sys_serv.SysModServ.Menu(modCodes); result != nil && result.RetCode == 1001 {
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok", Data: result.RetData})
	} else {
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "暂无内容"})
	}
}

// Select 获取树状模块及按钮的列表
func (c *sysModule) Select(w http.ResponseWriter, r *http.Request) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	if result := sys_serv.SysModServ.Select(); result != nil && result.RetCode == 1001 {
		modList := result.RetData.([]*sys_mod.SysModListRes)
		if btnRes := sys_serv.SysBtnServ.Select(); btnRes != nil && btnRes.RetCode == 1001 {
			allBtnList := btnRes.RetData.([]*sys_mod.SysBtnSelRes)
			for _, curMod := range modList {
				var btnList []*sys_mod.SysBtnSelRes
				for _, curBtn := range allBtnList {
					if curMod.ModId == curBtn.ModId {
						btnList = append(btnList, curBtn)
					}
				}
				curMod.BtnList = btnList
			}
		}
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok", Data: result.RetData})
	} else {
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "暂无内容"})
	}
}
